package com.steven.concurrency.example.singleton;

import com.steven.concurrency.annoations.NotRecommend;
import com.steven.concurrency.annoations.Recommend;

/**
 * 懒汉式 -双重检测机制
 */
@Recommend
public class LazySingleton1 {
    private LazySingleton1(){

    }

    private volatile static LazySingleton1 singleton = null;

    /**
     * 在new LazySingleton1() 单线程其实是走了三步
     * 1 分配内存空间 memory=allocate()
     * 2 初始化对象corinstance();
     * 3 把instance指向刚分配的memory内存
     *
     * jvm和cpu优化顺序发生了指令 重排列
     * 1 分配内存空间 memory=allocate()
      * 3 把instance指向刚分配的memory内存
     * 2 初始化对象corinstance();
     * 导致后果：线程2在线程1执行到第三步的时候检测到内存中已经有了instance了但是还没有被初始化就直接返回了，
     * 调用就会报错，出现无法预估的错误。
     * 解决方案：使用volatile关键字来修饰
     * @return
     */
    public static  LazySingleton1 getInstance(){
        if(singleton==null){
            synchronized (LazySingleton1.class){
                if(singleton==null){
                    singleton = new LazySingleton1();
                }
            }
        }
        return singleton;
    }
}
